﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VIP课程.Collections;
using VIP课程.Models;

namespace VIP课程
{
    delegate void MyDelegate(object param);//委托签名
    internal class Program
    {
        public static event MyDelegate OnLoad;
        static void Main(string[] args)
        {

            MyDelegate myaction = new MyDelegate(回调函数名);//实例化一个委托            
            myaction.Invoke("hello,world;");
            OnLoad += 回调函数名;//订阅事件

            List<string> list = new List<string>();//集合
            list.Add("1");
            list.Add("2");
            list.Add("3");
            list.Add("4");
            list.Add("5");
            list.Add("6");
            MyList<string> list2 = new MyList<string>();
            list2.Add("hello");
            list2.Add("world");
            Console.WriteLine(list2.Count);
            list2.Clear();
            Console.WriteLine(list2.Count);

            OnLoad.Invoke(list2);//触发事件

            Action<string> action = new Action<string>(回调函数名3);
            action.Invoke("Action委托的调用");

            Action<int> action2 = new Action<int>(回调函数名3);
            action2.Invoke(999);

            Person person= new Person();
            Console.WriteLine($"person.Age = {person.Age}");
            person.DoWork(DoAction);
            person.DoWork(() => DoAction());//调用当前DoAction()
            person.DoWork(() =>{Console.WriteLine("VIP课程2");});//大括号函数体，可以有很多语句
            person.DoWork(() => Console.WriteLine("VIP课程3"));//表示匿名函数的内容只有一句话
            person.DoWork(DoFunc);

            var v = list.Where(t => t == "2").ToList();

            list.ForEach(x=> Console.WriteLine(x));

            //////////////////////////////////////////


            Console.ReadKey();


        }

        //回调函数的签名和委托签名要保持一致
        static void 回调函数名 (object param)
        {
            Console.WriteLine(param);
        }

        static void 回调函数名2(object param)
        {
            Console.WriteLine(param);
        }


        //泛型方法
        static void 回调函数名3<T>(T param)
        {
            Console.WriteLine(param);
        }


        static void DoAction()
        {
            Console.WriteLine("VIP课程");
        }

        static long DoFunc(int number)
        {
            long result = 0;
            for (int i = 0; i < number; i++)
            {
                result -= i;
            }

            return result;
        }
    }
}
